<?php

namespace app\controller;

use boss\Validator;
use app\model\User;
use app\model\Blog as BlogModel;

final class Blog
{
    /**
     * 博客首页
     */
    public function index()
    {
        // 获取最新的帖子列表，最多10条
        $blogs = (new BlogModel())->list(10);
        $data = ['blogs' => $blogs];

        if (session('user_id')) {
            $data['user'] = (new User())->find(session('user_id'), 'id, username, golds');
        }


        return view('blog/index', $data);
    }

    /**
     * 发表页面
     */
    public function create()
    {
        return view('blog/create');
    }

    /**
     * 显示内容页面
     */
    public function show()
    {
        // 获取帖子id，并验证是否大于1
        $blog_id = (int)segment(3);

        // 获取帖子数据
        $blog = (new BlogModel())->find($blog_id);

        // 如果未找到帖子，显示 404 错误页面
        if (!$blog) {
            abort(404);
        }

        // 设置视图数据
        $data['blog']    = $blog;
        $data['blog_id'] = $blog_id;

        // 获取当前登录用户的ID
        // $user_id  = session('user_id');
        // if ($user_id) {
        //     // 获取用户数据
        //     $user = (new User())->find($user_id);
        //     $data['user'] = $user;
        // }

        // 保存当前页面地址，用于登录或注册后返回
        $current_url = url('/blog/show/') . $blog_id;
        session('back_to_link', $current_url);

        return view('blog/show', $data);
    }

    /**
     * 提交表单数据
     */
    public function submit()
    {
        if (!is_logined()) {
            return json('用户未登录');
        }

        if (!is_post()) {
            return json('请求方法不正确', 'error', 405);
        }

        // 获取表单数据
        $data = [
            'title'   => post(filter_all_html('title')),
            'content' => post('content', false),
        ];

        if (preg_match('/^(<p><br><\/p>|\s*)*$/', $data['content'])) {
            return json('内容不能为空');
        }

        // 验证表单数据
        $errors = self::validateFormData($data);
        if ($errors) {
            return json($errors);
        }

        try {
            (new BlogModel())->store($data);
            return json('发表成功，增加 1 金币', 'success');
        } catch (\Throwable $th) {
            throw new \Exception($th, 1);

            // return json($th->getMessage());
        }
    }

    /**
     * 表单数据验证
     *
     * @param array $data
     * @return string|null 错误消息或 null
     */
    private static function validateFormData(array $data): ?string
    {
        $rules  = [
            'title'   => ['string', '1,128',  '标题应为 1-128 个字符'],
            'content' => ['string', '1,2000', '内容应为 1-2000 个字符'],
        ];

        $validate = new Validator($data, $rules, true);

        if (!$validate->check()) {
            return $validate->error;
        }

        return null;  // 无错误
    }
}
